package com.example.demo.main.string;

/**
 * @author xieluoyin
 */
public class RemoveKc {
    public static void main(String[] args) {

        System.out.println(removeKc("1200030016510000045410054165100014000010", 3, '0'));
    }


    /**
     * 去掉字符串中连续出现k个c的子串
     *
     * @param str 字符串
     * @param k   连续几个c的子串去除
     * @param c   连续的字符
     * @return 去除后的字符串
     */
    public static String removeKc(String str, int k, char c) {
        if (str == null || k < 1) {
            return str;
        }
        char[] chas = str.toCharArray();
        //count连续c的个数
        //整型变量start，表示连续个c出现的开始位置。
        int count = 0, start = -1;
        //从左到右遍历str，假设遍历到i位置的字符为cha，根据具体的cha有不同的处理。
        for (int i = 0; i != chas.length; i++) {
            //如果cha是字符c，令start=start==-1？i：start，表示如果start等于-1，
            // 说明之前没处在发现连续的c的阶段，那么令start=i，表示连续的'0'从i位置开始，如果start不等于-1，
            // 说明之前就已经处在发现连续的'0'的阶段，所以start不变。令count++。
            if (chas[i] == c) {
                count++;
                start = start == -1 ? i : start;
            } else {
                //如果cha不是字符c，是去掉连续c的时刻。
                //首先看此时count是否等于k，
                // 如果等于，说明之前发现的连续k个c可以从start位置开始去掉，
                // 如果不等于，说明之前发现的连续的c数量不是k个，则不能去掉。
                if (count == k) {
                    /*
                     * 将后面的元素向前移动k个位置
                     * src - 源数组。
                     * srcPos - 源数组中的起始位置。
                     * dest - 目标数组。
                     * destPos - 目标数据中的起始位置。
                     * length - 要复制的数组元素的数量。
                     */
                    System.arraycopy(chas, start + k, chas, start, k);
                }
                //处理完成后令count=0，start=-1
                count = 0;
                start = -1;
            }
        }
        //既然把去掉连续c的时机放在了cha不是字符'0'的时候，
        // 那么如果str是以字符c结尾的，可能会出现最后一组正好有连续的k个'0'字符出现而没有去掉的情况。
        // 所以遍历完成后，再检查一下count是否等于k，如果等于，就去掉最后一组连续的k个'0'。
        if (count == k) {
            System.arraycopy(chas, start + k, chas, start, k);
        }
        return String.valueOf(chas);
    }
}
